home *** CD-ROM | disk | FTP | other *** search
/ Ham Radio 2000 #2 / Ham Radio 2000 - Volume 2.iso / HAMV2 / TCP_IP / TNOS230S / RIPCMD.C < prev    next >
Encoding:
C/C++ Source or Header  |  1997-08-18  |  10.5 KB  |  405 lines

  1. /* RIP-related user commands
  2.  *   Al Broscious, N3FCT
  3.  *   Phil Karn, KA9Q
  4.  *
  5.  *  Changes Copyright (c) 1993 Jeff White - N0POY, All Rights Reserved.
  6.  *  Permission granted for non-commercial copying and use, provided
  7.  *  this notice is retained.
  8.  *
  9.  * Rehack for RIP-2 (RFC1388) by N0POY 4/1993
  10.  *
  11.  * Beta release 11/10/93 V0.91
  12.  *
  13.  * 2/19/94 release V1.0
  14.  *
  15.  * rip98 support added, 29/3/97
  16.  */
  17.  
  18. #include "global.h"
  19. #ifdef RIP
  20. #include "commands.h"
  21. #include "mbuf.h"
  22. #include "netuser.h"
  23. #include "internet.h"
  24. #include "iface.h"
  25. #include "udp.h"
  26. #include "rip.h"
  27.  
  28. #if !defined(_lint)
  29. static char rcsid[] OPTIONAL = "$Id: ripcmd.c,v 1.17 1997/08/19 01:19:22 root Exp root $";
  30. #endif
  31.  
  32. static int doripproxy (int argc, char *argv[], void *p);
  33. static int doripauthadd (int argc, char *argv[], void *p);
  34. static int doripauthdrop (int argc, char *argv[], void *p);
  35. static int doripreject (int argc, char *argv[], void *p);
  36. static int doripfilter (int argc, char *argv[], void *p);
  37. static int doaddrefuse (int argc,char *argv[],void *p);
  38. static int doripmerge (int argc,char *argv[],void *p);
  39. static int dodroprefuse (int argc,char *argv[],void *p);
  40. static int doripadd (int argc,char *argv[],void *p);
  41. static int doripdrop (int argc,char *argv[],void *p);
  42. static int doripkick (int argc,char *argv[],void *p);
  43. static int doripreq (int argc,char *argv[],void *p);
  44. static int doriptrace (int argc,char *argv[],void *p);
  45. static int doripttl (int argc,char *argv[],void *p);
  46. static int dorip98rx (int argc,char *argv[],void *p);
  47.  
  48. static struct cmds Ripcmds[] =
  49. {
  50.     { "accept",    dodroprefuse,    0, 2, "rip accept <gateway> " },
  51.     { "add",    doripadd,    0, 3, "rip add <dest> <interval> [<flags>] [<ripver>] [AUTH <password>] [RD <routing domain>]" },
  52.     { "proxy",    doripproxy,    0, 4, "rip proxy <src> <dest> <interval> [<flags>] [AUTH <password>] [RD <routing domain>]" },
  53.     { "drop",    doripdrop,    0, 2, "rip drop <dest> [<domain>]" },
  54.     { "authadd",    doripauthadd,    0, 3, "rip authadd <interface> <routing domain> [<password>]" },
  55.     { "authdrop",    doripauthdrop,    0, 3, "rip authdrop <interface> <routing domain>" },
  56.     { "reject",    doripreject,    0, 2, "rip reject <version>" },
  57.     { "filter",    doripfilter,    0, 0, NULLCHAR },
  58.     { "kick",    doripkick,    0, 0, NULLCHAR },
  59.     { "merge",    doripmerge,    0, 0, NULLCHAR },
  60.     { "refuse",    doaddrefuse,     0, 2, "rip refuse <gateway>" },
  61.     { "request",    doripreq,    0, 2, NULLCHAR },
  62.     { "rip98rx",    dorip98rx,    0, 0, NULLCHAR },
  63.     { "status",    doripstat,    0, 0, NULLCHAR },
  64.     { "trace",    doriptrace,    0, 0, NULLCHAR },
  65.     { "ttl",    doripttl,    0, 0, NULLCHAR },
  66.     { NULLCHAR,    NULL,        0, 0, NULLCHAR }
  67. };
  68.  
  69.  
  70.  
  71. /* rip add 192.133.30.15 360 SUBPA 2 AUTH password RD 2 RT 0
  72.  * rip add <dest> <interval> <ripver> [<flags>] [AUTH <password>]
  73.  *    [RD <routing domain>]
  74.  * rip proxy <src> <dest> <interval> [<flags>] [AUTH <password>]
  75.  *    [RD <routing domain>]
  76.  * rip authadd <ifc> <rd> [<password>]
  77.  * rip authdrop <ifc> <rd>
  78.  * rip reject <ifc> <version>
  79.  * rip filter <on|off>
  80.  * rip drop <dest> <domain>
  81.  */
  82.  
  83. int
  84. dorip (int argc, char *argv[], void *p)
  85. {
  86.     return subcmd (Ripcmds, argc, argv, p);
  87. }
  88.  
  89.  
  90.  
  91. /* Facility to chuck away RIP98 frames when rip server is active */
  92. static int
  93. dorip98rx (int argc, char *argv[], void *p OPTIONAL)
  94. {
  95.     return setbool (&rip98allow, "Rip 98 reception", argc, argv);
  96. }
  97.  
  98.  
  99.  
  100. /* Add an entry to the RIP output list */
  101. static int
  102. doripadd (int argc, char *argv[], void *p OPTIONAL)
  103. {
  104. int x;
  105. char flags = RIP_SPLIT | RIP_BROADCAST | RIP_POISON;
  106. char ripver = 1;
  107. char rip_auth[RIP_AUTH_SIZE + 1];
  108. int16 domain = 0;
  109. int16 route_tag = 0;
  110. uint32 dest;
  111.  
  112.     for (x = 0; x < RIP_AUTH_SIZE + 1; x++)    /* Null out the string */
  113.         rip_auth[x] = '\0';
  114.  
  115.     strcpy (rip_auth, RIP_NO_AUTH);
  116.  
  117.     if (argc > 3)
  118.         flags = (char) htoi (argv[3]);
  119.     if (argc > 4)
  120.         ripver = (char) atoi (argv[4]);
  121.     if (argc > 5) {
  122.         for (x = 5; x < argc; x++) {
  123.             if (!strcmp (argv[x], "AUTH")) {
  124.                 x++;
  125.                 strncpy (rip_auth, argv[x], RIP_AUTH_SIZE);
  126.             } else if (!strcmp (argv[x], "RD")) {
  127.                 x++;
  128.                 domain = (int16) atoi (argv[x]);
  129.             }
  130.         }
  131.     }
  132.     dest = resolve (argv[1]);
  133.     if (rip_add (dest, atol (argv[2]), flags, ripver, rip_auth, domain, route_tag, 0))
  134.         return 0;
  135.     else
  136.         return 1;
  137. }
  138.  
  139.  
  140.  
  141. /* Add a proxy entry to the RIP output list */
  142. static int
  143. doripproxy (int argc, char *argv[] OPTIONAL, void *p OPTIONAL)
  144. {
  145. int x;
  146. char flags = RIP_SPLIT | RIP_BROADCAST | RIP_POISON;
  147. char ripver = RIP_VERSION_2;
  148. char rip_auth[RIP_AUTH_SIZE + 1];
  149. int16 domain = 0;
  150. int16 route_tag = 0;
  151. uint32 dest;
  152. uint32 proxy;
  153.  
  154.     for (x = 0; x < RIP_AUTH_SIZE+ 1; x++)    /* Null out the string */
  155.         rip_auth[x] = '\0';
  156.  
  157.     strcpy (rip_auth, RIP_NO_AUTH);
  158.  
  159.     if (argc > 4)
  160.         flags = (char) htoi (argv[4]);
  161.     if (argc > 5) {
  162.         for (x = 5; x < argc; x++) {
  163.             if (!strcmp (argv[x], "AUTH")) {
  164.                 x++;
  165.                 strncpy (rip_auth, argv[x], RIP_AUTH_SIZE);
  166.             } else if (!strcmp (argv[x], "RD")) {
  167.                 x++;
  168.                 domain = (int16) atoi (argv[x]);
  169.             }
  170.         }
  171.     }
  172.     dest = resolve (argv[2]);
  173.     proxy = resolve (argv[1]);
  174.     (void) rip_add (dest, atol (argv[3]), flags, ripver, rip_auth, domain, route_tag, proxy);
  175.     return 1;
  176. }
  177.  
  178.  
  179.  
  180. /* Add an entry to the RIP refuse list */
  181. int
  182. doaddrefuse (int argc OPTIONAL, char *argv[], void *p OPTIONAL)
  183. {
  184.     return riprefadd (resolve (argv[1]));
  185. }
  186.  
  187.  
  188.  
  189. /* Drop an entry from the RIP output list */
  190. static int
  191. doripdrop (int argc, char *argv[], void *p OPTIONAL)
  192. {
  193. int16 domain = 0;
  194.  
  195.     if (argc > 2)
  196.         domain = (int16) atoi (argv[2]);
  197.  
  198.     return rip_drop (resolve (argv[1]), domain);
  199. }
  200.  
  201.  
  202.  
  203. /* Add an entry to the RIP authentication list */
  204. static int
  205. doripauthadd (int argc, char *argv[], void *p OPTIONAL)
  206. {
  207.     return ripauthadd (argv[1], (int16) atoi (argv[2]), (argc > 3) ? argv[3] : RIP_NO_AUTH);
  208. }
  209.  
  210.  
  211.  
  212. /* Drop an entry from the RIP authentication list */
  213. static int
  214. doripauthdrop (int argc OPTIONAL, char *argv[], void *p OPTIONAL)
  215. {
  216.     return ripauthdrop (argv[1], (int16) atoi (argv[2]));
  217. }
  218.  
  219.  
  220.  
  221. static int
  222. doripkick (int argc OPTIONAL, char *argv[] OPTIONAL, void *p OPTIONAL)
  223. {
  224. register struct rip_list *rl;
  225.  
  226.     rl = (struct rip_list *) Rip_list;
  227.     if (Rip_list != NULLRL)
  228.         for (rl = Rip_list; rl != NULLRL; rl = rl->next)
  229.             rip_shout (rl);
  230.     return 0;
  231. }
  232.  
  233.  
  234.  
  235. /* Drop an entry from the RIP refuse list */
  236. static int
  237. dodroprefuse (int argc OPTIONAL, char *argv[], void *p OPTIONAL)
  238. {
  239.     return riprefdrop (resolve (argv[1]));
  240. }
  241.  
  242.  
  243.  
  244. /* Initialize the RIP listener */
  245. int
  246. doripinit (int argc OPTIONAL, char *argv[] OPTIONAL, void *p OPTIONAL)
  247. {
  248.     return rip_init ();
  249. }
  250.  
  251.  
  252.  
  253. int
  254. doripstop (int argc OPTIONAL, char *argv[] OPTIONAL, void *p OPTIONAL)
  255. {
  256.     (void) del_udp (Rip_cb);
  257.     Rip_cb = NULLUDP;
  258.     return 0;
  259. }
  260.  
  261.  
  262.  
  263. static int
  264. doripreq (int argc, char *argv[], void *p OPTIONAL)
  265. {
  266. int16 replyport;
  267. int16 version;
  268.  
  269.     if (argc > 2)
  270.         version = (int16) atoi (argv[2]);
  271.     else
  272.         version = 2;
  273.  
  274.     if (argc > 3)
  275.         replyport = (int16) atoi (argv[3]);
  276.     else
  277.         replyport = RIP_PORT;
  278.     return ripreq (resolve (argv[1]), replyport, version);
  279. }
  280.  
  281.  
  282.  
  283. /* Dump RIP statistics */
  284. int
  285. doripstat (int argc OPTIONAL, char *argv[] OPTIONAL, void *p OPTIONAL)
  286. {
  287. struct rip_list *rl;
  288. struct rip_refuse *rfl;
  289. struct rip_auth *ra;
  290. int cnt;
  291.  
  292.     for (cnt = 1; cnt < RIP_VERSIONS; cnt++) {
  293.         if (cnt != RIP_VERSION_X)
  294.             tprintf ("RIP V%d:  sent %lu rcvd %lu reqst %lu resp %lu unk %lu\n",
  295.                 cnt, Rip_stat.vdata[cnt].output, Rip_stat.vdata[cnt].rcvd,
  296.                 Rip_stat.vdata[cnt].request, Rip_stat.vdata[cnt].response,
  297.                 Rip_stat.vdata[cnt].unknown);
  298.         else
  299.             tprintf ("RIP V98: sent %lu rcvd %lu reqst %lu resp %lu unk %lu\n",
  300.                 Rip_stat.vdata[cnt].output, Rip_stat.vdata[cnt].rcvd,
  301.                 Rip_stat.vdata[cnt].request, Rip_stat.vdata[cnt].response,
  302.                 Rip_stat.vdata[cnt].unknown);
  303.     }
  304.  
  305.     tprintf ("Version Errors:            %lu   ", Rip_stat.version);
  306.     tprintf ("Address Family Errors:     %lu\n", Rip_stat.addr_family);
  307.     tprintf ("Rip refusals:              %lu   ", Rip_stat.refusals);
  308.     tprintf ("Wrong Domain on Interface: %lu\n", Rip_stat.wrong_domain);
  309.     tprintf ("Authentication failures:   %lu   ", Rip_stat.auth_fail);
  310.     tprintf ("Unknown Authentication:    %lu\n", Rip_stat.unknown_auth);
  311.  
  312.     if (Rip_list != NULLRL) {
  313.         tprintf ("Active RIP output interfaces:\n");
  314.         tprintf ("Ver Dest Addr       Int  Flags Domain Proxy           Authentication\n");
  315.         for (rl = Rip_list; rl != NULLRL; rl = rl->next) {
  316.             tprintf ("%-4d%-16s%-5lu0x%-4X%-7u", rl->rip_version,
  317.                  inet_ntoa (rl->dest), rl->interval, rl->flags, rl->domain);
  318.             tprintf ("%-16s%-16s\n", inet_ntoa (rl->proxy_route), rl->rip_auth_code);
  319.         }
  320.     }
  321.     if (Rip_refuse != NULLREF) {
  322.         tprintf ("Refusing announcements from gateways:\n");
  323.         for (rfl = Rip_refuse; rfl != NULLREF; rfl = rfl->next) {
  324.             if (tprintf ("%s\n", inet_ntoa (rfl->target)) == EOF)
  325.                 break;
  326.         }
  327.     }
  328.     if (Rip_auth != NULLAUTH) {
  329.         tprintf ("\nAuthentications accepted:\n");
  330.         tprintf ("Interface           Domain   Password\n");
  331.         for (ra = Rip_auth; ra != NULLAUTH; ra = ra->next) {
  332.             tprintf ("%-20s%-9u%-16s\n", ra->ifc_name, ra->domain, ra->rip_auth_code);
  333.         }
  334.     }
  335.     tprintf ("Refusing versions less than or equal to V%d\n", Rip_ver_refuse);
  336.  
  337.     return 0;
  338. }
  339.  
  340.  
  341.  
  342. static int
  343. doriptrace (int argc, char *argv[], void *p OPTIONAL)
  344. {
  345.     if (argc > 1) {
  346.         Rip_trace = (int16) atoi (argv[1]);
  347.         if ((Rip_trace == 0) && (Rip_trace_file != NULLFILE)) {    /* Turn off tracing */
  348.             (void) fclose (Rip_trace_file);
  349.             Rip_trace_file = NULLFILE;
  350.             if (Rip_trace_fname != NULLCHAR) {
  351.                 free (Rip_trace_fname);
  352.                 Rip_trace_fname = NULLCHAR;
  353.             }
  354.         }
  355.         if (argc > 2) {
  356.             if ((Rip_trace_file = fopen (argv[2], APPEND_TEXT)) == NULLFILE)
  357.                 tprintf ("Cannot write to %s\n", argv[2]);
  358.             else
  359.                 Rip_trace_fname = strdup (argv[2]);
  360.  
  361.             (void) fclose (Rip_trace_file);
  362.         }
  363.     } else {
  364.         if (Rip_trace_file != NULLFILE)
  365.             tprintf ("Tracing RIP status level %d to file %s\n", Rip_trace,    Rip_trace_fname);
  366.         else
  367.             tprintf ("Tracing RIP status level %d\n", Rip_trace);
  368.     }
  369.     return 0;
  370. }
  371.  
  372.  
  373.  
  374. static int
  375. doripttl (int argc, char *argv[], void *p OPTIONAL)
  376. {
  377.     return setlong (&Rip_ttl, "RIP route ttl", argc, argv);
  378. }
  379.  
  380.  
  381.  
  382. static int
  383. doripreject (int argc, char *argv[], void *p OPTIONAL)
  384. {
  385.     return setshort (&Rip_ver_refuse, "RIP version refusal level", argc, argv);
  386. }
  387.  
  388.  
  389.  
  390. static int
  391. doripmerge (int argc, char *argv[], void *p OPTIONAL)
  392. {
  393.     return setbool ((int *) &Rip_merge, "RIP merging", argc, argv);
  394. }
  395.  
  396.  
  397.  
  398. int
  399. doripfilter (int argc, char *argv[], void *p OPTIONAL)
  400. {
  401.     return setbool ((int *) &Rip_default_refuse, "RIP default refusal", argc, argv);
  402. }
  403.  
  404. #endif
  405.